
using System;

using System.Collections.Generic;
using UnityEngine;

// public class CQueue : MonoBehaviour
// {
//     public Stack<int> stack_in;
//     public Stack<int> stack_out;


//     public CQueue()
//     {
//         this.stack_in = new Stack<int>();
//         this.stack_out = new Stack<int>();

//     }

//     public void AppendTail(int value)
//     {
//         stack_in.Push(value);
//     }

//     public int DeleteHead()
//     {
//         if (stack_out.Count <= 0)
//         {
//             while (stack_in.Count > 0)
//             {
//                 int popValue = stack_in.Pop();
//                 stack_out.Push(popValue);
//             }
//         }

//         if (stack_out.Count > 0)
//         {
//             return stack_out.Pop();
//         }
//         return -1;
//     }
// }

class test : MonoBehaviour
{
    MinStack minStack = new MinStack();

    List<int> list=new List<int>();
    void Start()
    {

        // list.Add(1);
        // list.Add(2);
        // Debug.Log(list[1]);

        minStack.Push(0);
        minStack.Push(1);
        minStack.Push(0);
        minStack.Min();   //--> 返回 -3.
       // minStack.Pop();//
        minStack.Pop();  //    --> 返回 0.
        minStack.Min();

       // minStack.Push(1);
       // minStack.Pop();
        //int param_3 = minStack.Top();
        //int param_4 = minStack.Min();

    }


}
public class MinStack
{

    public List<int> list;
    public List<int> list_min;//用来维护最小值的数组

    /** initialize your data structure here. */
    public MinStack()
    {
        list = new List<int>();
        list_min = new List<int>();
        
    }

    public void Push(int x)
    {
        if (list_min.Count <= 0)
        {
            list_min.Add(x);
        }
        else
        {
            if (list_min[list_min.Count-1] >= x)
            {
                list_min.Add(x);

            }
        }
        list.Add(x);
    
    }

    public void Pop()
    {
        if (list[list.Count-1] == list_min[list_min.Count-1])
        {
            list_min.RemoveAt(list_min.Count-1);
        }
        list.RemoveAt(list.Count-1);
    }

    public int Top()
    {
        
        return list[list.Count-1];
       
    }

    public int Min()
    {
        Debug.Log(this.list);
        Debug.Log(this.list_min);
        return list_min[list_min.Count-1];
    }
}

/**
 * Your MinStack object will be instantiated and called as such:
 * MinStack obj = new MinStack();
 * obj.Push(x);
 * obj.Pop();
 * int param_3 = obj.Top();
 * int param_4 = obj.Min();
 */